package com.market.config;

import cn.hutool.core.util.StrUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j  // 使用Lombok提供的日志功能
// @Component  // 已注释掉，可能是由于WebSocket上下文中的空指针异常问题
public class TokenInterceptor implements RequestInterceptor {

    // 定义token在请求头中的名称
    // @Value("${sa-token.token-name}")  // 注释掉的配置注入，应该使用这种方式从配置文件获取
    private String tokenName = "token";  // 硬编码token名称，应与sa-token.token-name配置一致

    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 获取当前HTTP请求的属性
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        
        // 注意：在WebSocket或非HTTP上下文中，requestAttributes可能为null，导致空指针异常
        // 应添加null检查: if (requestAttributes != null) { ... }
        
        // 从请求头中获取token
        String tokenValue = requestAttributes.getRequest().getHeader(tokenName);
        
        // 如果token存在，则添加到Feign请求头中
        if(StrUtil.isNotEmpty(tokenValue)){
            // 将token添加到Feign请求的请求头中，实现token的传递
            requestTemplate.header(tokenName, tokenValue);
            log.warn("token转发 - {}" , tokenValue);  // 记录token传递的日志，注意这里用warn级别可能不合适
        } else {
            // 没有找到token时的日志记录
            log.warn("token转发 - 请求头中并没有Token");  // 同样，warn级别可能过高
        }
    }
}